package projeto.controller;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import projeto.model.LeituraDeDados;
import projeto.model.Usuario;
/**
 * 
 * @author Javatar
 * Classe usada para fazer um controle de usuários do sistema,
 * através de uma lista e um Buffer.
 */
public class ControleDeUsuarios {
	private final int DETESTO = -5,MUITO_RUIM = -4,BASTANTE_RUIM = -3,RUIM = -2,POUCO_RUIM = -1,
					  NAO_CONHECO = 0,NA0_RUIM = 1,BONZINHO = 2,BASTANTE_BOM = 3,MUITO_BOM = 4,INCRIVEL = 5;
	private static Usuario user;
	private static ControleDeUsuarios instanciaUnica = null;
	private List<Usuario> usuarios;
	/**
	 * Construtor privado para não ser possível instanciar um construtor da classe
	 * @param fileName - nome do arquivo a ser lido (String).
	 */
	private ControleDeUsuarios(String fileName){
		usuarios = LeituraDeDados.lerUsuarios(fileName);
	}
	/**
	 * Instancia tardia, para não permitir chamadas ao construtor.
	 * @param fileName - nome do arquivo a ser lido(String);
	 * @return instanciaUnica - ControleDeUsuarios instância unica da classe.
	 */
	public static ControleDeUsuarios getInstance(String fileName){
		if(instanciaUnica == null)
			instanciaUnica = new ControleDeUsuarios(fileName);
		return instanciaUnica;
	}
	/**
	 * Método que adiciona usuário ao controle usando uma lista para guardar os usuários.
	 * @param user - Usuário a ser adicinado a lista(Usuario).
	 */
	public void addUsuario(Usuario user){
		usuarios.add(user);
	}
	/**
	 * Método que remove usuários da lista de controle de usuário.
	 * @param user - Usuário a ser removido da lista de controle(Usuario).
	 */
	public void removeUsuario(Usuario user){
		usuarios.remove(user);
	}
	/**
	 * Método para acessar lista de usuários presente na classe.
	 * @return usuarios - List<Usuario> com os usuários presentes em controle.
	 */
	public List<Usuario> getListaDeUsuarios(){
		return usuarios;
	}
	/**
	 * Método usado pra criar usuários que não deram opiniões sobre os estabelecimento,
	 * estes usuários usam o programa apenas pra pesquisa.
	 * @throws Exception - Exceção que pode ser lançada de acordo com o contrutor de Usuario. 
	 */
	public void criaUsuario()throws Exception{
		List<Integer> opinioes = new ArrayList<Integer>();
        for(int i = 0; i < 39;i++){
            opinioes.add(0);
        }
        
        user = new Usuario("dd/MM/yyyy HH:mm:ss","",opinioes);
	}
	/**
	 * Método que mostra usuário para o qual a classe aponta no momento.
	 * @return user - Usuario no qual a classe está apontando.
	 */
	public Usuario getUsuario(){
		return user;
	}
	/**
	 * Método que escreve os usuários em um arquivo.
	 * @param user - usuário a ser escrito no arquivo(Usuario);
	 * @param fileName - nome do arquivo a ser usado (String);
	 * @return true ou false - se o usuario foi escrito ou não.
	 */
	public boolean escreveUsuario(Usuario user, String fileName){
		String formatacaoOpinioes = "";
		for(int opiniao : user.getOpnioes()){
			switch(opiniao){
				case DETESTO:
					formatacaoOpinioes += ";-5 : Detesto";
					break;
				case MUITO_RUIM:
					formatacaoOpinioes += ";-4 : Acho muito ruim";
					break;
				case BASTANTE_RUIM:
					formatacaoOpinioes += ";-3 : Bastante ruim";
					break;
				case RUIM:
					formatacaoOpinioes += ";-2 : Bastante ruim";
					break;
				case POUCO_RUIM:
					formatacaoOpinioes += ";-1 : Acho um pouco ruim";
					break;
				case NAO_CONHECO:
					formatacaoOpinioes += ";0 : Não conheço";
					break;
				case NA0_RUIM:
					formatacaoOpinioes += ";1 : Não é ruim";
					break;
				case BONZINHO:
					formatacaoOpinioes += ";2 : É bonzinho";
					break;
				case BASTANTE_BOM:
					formatacaoOpinioes += ";3 : Bastante bom";
					break;
				case MUITO_BOM:
					formatacaoOpinioes += ";4 : Muito bom";
				case INCRIVEL:
					formatacaoOpinioes += ";5 : Incrível, sensacional, impressionante";
				default:
					break;
					
			}
		}
		String saida = user.getData()+ ";" + user.getNome()+formatacaoOpinioes;
		
		PrintWriter outputStream = null;
		try{
			outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName,true),"UTF-8")));
			outputStream.append(System.getProperty("line.separator")+saida);
			addUsuario(user);
			
		}catch(FileNotFoundException e2){
			return false;

		}catch(IOException e){
			return false;
		}
		finally{
			if (outputStream != null) {
	            outputStream.close();
	         }
		}
		return true;
	}
}
